package de.fhin.mas.agents.searcher.behaviours;

import jade.core.AID;
import jade.core.behaviours.TickerBehaviour;
import jade.lang.acl.ACLMessage;
import jade.util.leap.ArrayList;

import java.util.logging.Level;

import de.fhin.mas.MASEvents;
import de.fhin.mas.agents.searcher.SearcherAgent;
import de.fhin.mas.ontology.EnvironmentScanResult;
import de.fhin.mas.ontology.RelativeDistance;
import de.fhin.mas.util.MessageUtil;

/**
 * Dieses <tt>Behaviour</tt> erweitert den <tt>SearcherAgent</tt> um die
 * Umgebungserfassung.
 * 
 * @author Andreas Schmidl
 * @author Thomas Schlaefer
 */
public class EnvironmentScan extends TickerBehaviour {

	/**
	 * Die eindeutige ID zur Serialisierung ueber das Netzwerk.
	 */
	private static final long serialVersionUID = 7153078172278103802L;

	/**
	 * Erzeugt eine neue Instanz des <tt>TargetSearch</tt>-Behaviours.
	 * 
	 * @param parentAgent
	 *            Der Sucher-Agent, zu dem das Behaviour gehoeren soll.
	 */
	public EnvironmentScan(SearcherAgent parentAgent) {
		super(parentAgent, 2000);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void onTick() {
		SearcherAgent searcherAgent = ((SearcherAgent) myAgent);
		if (searcherAgent.getNavigator() == null) {
			searcherAgent
					.getLogger()
					.log(Level.WARNING,
							"environmentscan: Kein Navigator-Service auf der Plattform verfügbar");
			return;
		}

		// Sensoren werden ausgelesen
		ArrayList obstacles = readSensors();
		EnvironmentScanResult result = new EnvironmentScanResult(obstacles);

		ACLMessage environmentScanMsg = MessageUtil.buildMessage(null,
				MASEvents.ENVIRONMENT_SCAN_FINISHED.getName(),
				ACLMessage.INFORM, new AID[] { ((SearcherAgent) myAgent)
						.getNavigator() });
		// Content der ACLMessage mit den EnvironmentScanResult Daten befüllen
		environmentScanMsg = searcherAgent.fillMsgContent(environmentScanMsg,
				result);

		searcherAgent.send(environmentScanMsg);
	}

	/**
	 * Diese Methode liest Daten aus den Sensoren aus.
	 * 
	 * @return <tt>jade.util.leap.ArrayList</tt> mit den Entfernungsdatensätzen
	 *         der Sensoren
	 */
	private ArrayList readSensors() {
		int angle = 180;
		int distance = 0;
		ArrayList obstacles = new ArrayList();
		RelativeDistance rd;

		/*
		 * Hier werden nur Pseudodaten generiert, solange wir noch nicht direkt
		 * auf die Hardware des Roboters zugreifen können
		 */
		for (angle = 180; angle > -180; angle -= 10) {
			// distance = (int) (Math.random() * 100.0);
			distance = -1; // negativer Wert := kein Hindernis in Reichweite
			rd = new RelativeDistance(angle, distance);
			obstacles.add(rd);
		}

		return obstacles;
	}
}
